package com.cskaoyan.javase.oop1._13block._2static._1notice;
/**
 * 注意事项
 * 一些细节问题（重要）
 * 1.静态代码块可以近似看成一个，在类加载时期自动调用的静态成员方法，所以不能在里面调用非静态。（没有对象）
 *      包括this关键字，和后面学习的super关键字，都不能使用。
 * 这意味虽然构造代码块可以给静态成员变量赋值，但静态代码块不能给成员变量赋值。
 * 说白了，还是要搞清楚，谁先谁后执行的问题！
 *
 * 2.在静态代码块中定义的变量,仍然于是一个局部变量,千万不要认为它是静态成员变量.
 *
 * 3.当需要使用复杂的代码给静态成员变量赋值时，可以使用静态代码块。
 *      但如果仅仅是简单的赋值，直接显式赋值即可。
 * 总得来说，静态代码块用得不多。
 *
 * 4.静态代码块也经常被用来测试类加载的顺序（重要）
 * 一个类的静态代码块如果没有被执行，说明它没有被完全类加载。
 *
 * @since 16:35
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    static {
        System.out.println("Demo类类加载了!");
    }
    public static void main(String[] args) {
        new A();
    }
}
class A{
    int num;
    /*
        静态成员变量的显式赋值
        需要创建B对象,需要类加载B
     */
    static B b = new B();
    static {
        // Non-static field 'num' cannot be referenced from a static context
        // System.out.println(num);
        System.out.println("A类进行类加载了!");
    }
}
class B{
    static {
        System.out.println("B类类加载了!");
    }
}